package com.chushouya.common.util;

import cn.hutool.core.util.URLUtil;
import com.chushouya.common.constant.DangDangConstants;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;

import java.nio.charset.Charset;
import java.util.Map;
import java.util.TreeMap;

/**
 * 铛铛签名工具类
 */
@Slf4j
public class DangDangSignUtil {

    /**
     * 生成签名
     * @param appId 应用ID
     * @param appSecret 应用密钥
     * @param timestamp 时间戳
     * @return 签名字符串
     */
    public static String generateSign(String appId, String appSecret, String timestamp) {
        // 字典排序
        Map<String, String> treeMap = new TreeMap<>();
        treeMap.put("appId", appId);
        treeMap.put("appSecret", appSecret);
        treeMap.put("timestamp", timestamp);

        // 拼接query_string
        // timestamp=1625112147813&appId=test&appSecret=test
        String urlParams = URLUtil.buildQuery(treeMap, Charset.defaultCharset());
        
        log.debug("签名参数字符串: {}", urlParams);

        // md5运算得到sign
        String signStr = DigestUtils.md5Hex(urlParams);
        
        log.debug("生成的签名: {}", signStr);
        
        return signStr;
    }

    /**
     * 生成当前时间戳的签名
     * @return 签名字符串
     */
    public static String generateSign() {
        String timestamp = String.valueOf(System.currentTimeMillis());
        return generateSign(DangDangConstants.APP_ID, DangDangConstants.APP_SECRET, timestamp);
    }

    /**
     * 获取当前时间戳
     * @return 时间戳字符串
     */
    public static String getCurrentTimestamp() {
        return String.valueOf(System.currentTimeMillis());
    }

    /**
     * 验证签名是否正确
     * @param appId 应用ID
     * @param appSecret 应用密钥
     * @param timestamp 时间戳
     * @param sign 待验证的签名
     * @return 验证结果
     */
    public static boolean verifySign(String appId, String appSecret, String timestamp, String sign) {
        String expectedSign = generateSign(appId, appSecret, timestamp);
        return expectedSign.equals(sign);
    }
}
